C#基础

复杂数据类型

一般是多个数据集合在一起构成的数据。

枚举

是一个被命名的整型常量的集合

基本结构

1
2
3
4
5
6
enum E_xxx
{
x1,
x2,
x3,
}

枚举中如果没有赋值的话式默认自动上升序列

在哪里声明

在namespace结构块里声明(常用)。
也可以声明在class和struct结构块里。
但是不可以在函数语句块里声明。

枚举的使用

虽然枚举的声明在函数外,但是使用枚举仍然在函数里。

例如:

1
E_xxx xxx = E_xxx.x1;

由于枚举是一个常量集合,因此他与swich高度适配。

枚举的类型转换

基本遇不到,如果遇到就直接强转。

string转枚举

1
xxx = (E_xxx)Enum.Parse(typeof(E_xxx), "x2");

一维数组

数组的声明

1
int[] arr1;
1
int[] arr2 = new int[5];
1
int[] arr3 = new int[5]{ 1, 2, 3, 4, 5};
1
int[] arr4 = new int[]{1, 2, 3, 4};
1
int[] arr5 = {1, 2, 3, 4, 5, 6};

数组的长度

1
console.WriteLine(arr.Length);

获取数组中的元素

与c++一致。

修改数组的元素

与c++一致

遍历数组

与c++一致

增加或减少数组的元素

不能直接增加或者减少,只能搬家。

查找数组中的元素

遍历一遍然后寻找和要找的值相等的数。

二维数组

二维数组的声明

1
int[,] arr;
1
int[,] arr2 = new int[n, m];
1
int[,] arr3 = new int[3,3]{{1, 2, 3}, {1, 2, 3}};
1
int[,] arr4 = new int[,] { {1, 2, 3}, {1, 2, 3}};

数组的行和列

1
2
Console.WriteLinne(arr.GetLength(0));//行
Console.WriteLinne(arr.GetLength(1));//列

增加和减少元素

和一维数组相似,无法直接删除或添加,只能搬家。

查找元素

与一位数组一样,也是遍历查找。

交错数组

数组的数组

数组的声明

1
int[][] arr1;
1
int[][] arr2 = new int[3][];
1
int[][] arr3 = new int[3][] { new int[]{1, 2, 3},new int[]{1, 2}, new int[]{1}};
1
int[][] arr4 = new int[][] {new int[]{1, 2, 3},new int[]{1, 2}, new int[]{1}};
1
int[][] arr5 = {...};

数组的长度

1
2
Console.WriteLine(arr.GetLength(0));//行
Console.WriteLine(arr[0].Length);//列

获取数组中的元素

1
Console.WriteLine(arr[0][1]);

值的类型和引用类型

引用类型

string,数组, 类都是引用类型。
相互赋值时让两者指向同一个值,类似指针

引用类型存储在 堆空间

  • 手动申请和释放,大而慢。

值类型

除了上述三类之外都是值类型。
相互赋值时会把内容拷贝给对方

值类型存储在 栈空间

  • 系统分配,小而快。

特殊的引用类型string

string非常特殊,它具备值类型的特征:他变我不变。
每次对string赋值都会重新开一个空间,会消耗相应的内存。

因此存在一个string的缺点,就是在不断重复赋值的过程中会不断产生内存垃圾,影响程序性能。

函数

函数的基础

函数写在哪

函数写在class和struct语句块中。

函数的写法

static 返回类型 函数名(参数类型 参数名1, 参数类型 参数名2,…….)
{
函数的代码逻辑;
…………..;
return 返回类型;
}

关于函数名,一般使用帕斯卡命名法

ref 和 out

他们可以解决在函数内部改变外部传入的内容的问题

ref 和 out 的使用

就是在函数声明时,在变量前面加一个ref,同理在使用的时也在传入的参数前面加一个ref。
out的使用上与ref一模一样。

ref 和 out 的区别

1、ref传入的变量必须初始化,out不用。
2、out传入的变量必须在内部赋值,ref不用。

变长参数和参数默认值

变长参数的关键词

params。

1
2
3
4
5
6
7
8
9
static int Sum(params int[] arr)
{
int sum = 0;
for(int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
return sum;
}

变长参数意味着可以传入任意个参数,传入参数会存在arr数组中。

写params后,参数类型必须是数组,否则会报错
函数参数中最多只能出现一个params关键字,而且一定是最后一组参数,前面可以有其他参数。

参数默认值(可选参数)

当调用函数的时候可以不传入参数,不传入参数就会使用默认参数值作为参数的值。

支持多参数默认值,每一个参数都可以有默认值。
如果要混用可选参数 必须加在 普通参数后面。

函数重载

基本概念

在同一个语句块中,函数名相同,参数类型不同,参数数量不同。

使用

使用时直接传参进去就可以,系统会根据你传参的类型和数量自动进行判断。

递归函数

与c++一致。

结构体

在结构体中的方法,不需要加static关键字。

函数中可以直接使用结构体内部声明的变量。

大部分结构体相关知识与c++一致

修饰词

在c#中结构体内部的变量初始均为私有,只有自己改成公共才能在外部使用。修改方式为:

1
2
public int a;
private int b;

结构体构造函数

一般用于方便外部对变量进行初始化的。

在结构体中构造函数,函数名一定是结构体名,没有返回值,必须有参数,参数必须初始化。

新关键字 this :表示自己。

使用:

1
Student s2 = new Student(18, true, 2, "小红");

排序

与c++算法一致。